iT邦幫忙

2024 iThome 鐵人賽

DAY 10
0
DevOps

我獨自升級:從水管工走向 DataOps系列 第 10

【Day 10】DBT 新手村入門:架構說明

  • 分享至 

  • xImage
  •  

前言

我這邊的說明和舉例其實都是 dbt Core 的部分,老實說 dbt Cloud 我也沒有好好玩過,所以先打個預防針,避免差異過大,造成誤導,如果有任何疑問或是我寫錯的,超級歡迎直接留言,我也在持續學習中~/images/emoticon/emoticon33.gif

dbt 架構

{dbt_project_name}/
├── macros/
├── logs/
├── snapshots/
├── analyses/
├── seeds/
├── tests/
├── models/
├── target/
├── profile.yml
└── dbt_project.yml

必要的部分:

models/

這是 dbt 最核心的部分。models/ 資料夾裡存放的是你的 SQL 查詢,這些查詢會根據你的設計生成資料表或檢視表,供其他分析使用。你可以進一步建立子資料夾來組織不同的模型,通常會依據資料庫中的不同資料表或模組來分類。例如,你可以為每個資料表建立不同的子資料夾(如 staging/ 或 marts/),這不僅方便管理,也有助於 dbt 高效地執行查詢。

  • 實際 models/ 內部結構像下方範例,每一層裡面還會有 schema.yml 去定義 SQL 產生的 VIEW / TABLE 欄位細節。
models/
├── staging/
|   ├── schema.yml
|   └── stg_users.sql
└── marts/
    ├── schema.yml
    └── user_orders.sql

dbt_project.yml

這是專案的設定檔,定義專案的基本資訊(例如專案名稱、資料夾結構、模型路徑等),並且可以在這裡設定一些執行 dbt 的規則。這是讓 dbt 知道如何正確執行你的專案的關鍵檔案。

profile.yml

這個檔案是必需的,因為它設定資料庫的連接資訊,讓 dbt 知道怎麼連接到你的資料庫。不同的資料庫(例如 PostgreSQL、BigQuery 等)會有不同的設定格式,這是 dbt 與資料庫溝通的橋樑。

這個檔案通常不會存放在專案的根目錄中,而是放在 dbt 的全域設定目錄下(例如:~/.dbt/profiles.yml)

非必要但重要的部分:

macros/

這裡放的是一些共用的 SQL 函數或模板(與 Jinja 模板語言整合),讓你可以重複使用相同的程式碼,而不需要每次都重新撰寫。例如,你可以在這裡定義一個範本來過濾重複的資料,並在不同的模型中反覆使用。

題外話:Jinja 模板是什麼呢?

Jinja 是一種現代的 Python 模板引擎,主要用於生成動態內容。它允許你將程式邏輯和資料分離,使得代碼更易於維護和重用。Jinja 提供了控制結構(如條件語句和迴圈)、變數替換、過濾器和宏等功能,這些功能在 dbt 中特別有用。

  • 最簡單的變數替換: 使用雙大括號 {{ }} 來顯示變數的值。
SELECT *
FROM {{ ref('my_model') }}
  • 複雜一點可能像下方範例:包含條件語句、迴圈和宏(macros)
{% macro generate_order_count_query(user_ids) %}
    SELECT user_id, COUNT(order_id) AS order_count
    FROM orders
    WHERE user_id IN (
        {% for id in user_ids %}
            {{ id }}{% if not loop.last %}, {% endif %}
        {% endfor %}
    )
    GROUP BY user_id
{% endmacro %}
  • 使用上只需要這樣
-- 使用宏(macros)
{{ generate_order_count_query([1, 2, 3]) }}

snapshots/

這個資料夾存放的是你對資料進行快照的查詢,當你需要追蹤資料的歷史變化時,這裡會非常有用。dbt 的 snapshots 功能允許你保存特定時間點的數據,並隨時間進行追蹤,這在分析數據變動(例如價格變動或狀態變更)時非常有幫助。使用 dbt snapshot 命令來執行。

analyses/

這裡是放置分析 SQL 查詢的地方,通常這些分析結果不會成為資料庫中最終的資料表或檢視表,但可以幫助你理解數據或作為報告的一部分。這些查詢主要是幫助分析師或資料科學家做一些臨時的數據探索。

seeds/

資料夾中存放的是靜態的參考資料,這些資料可以透過 dbt seed 命令自動匯入到資料庫中成為表格。常見的使用場景是像國家代碼或幣別等固定不變的參考數據。

tests/

這裡是放置測試邏輯的地方,通常用來檢查你的資料模型是否符合預期(例如:資料是否有重複、欄位值是否正確)。dbt 支持多種測試類型,除了檢查資料的唯一性和空值外,還可以進行關聯性測試(例如檢查外鍵關聯性),以確保資料庫的一致性和完整性。

target/

這是 dbt 執行結果的存放區,系統會在運行時自動生成這個資料夾。這裡會存放一些結果檔案:

  • catalog.json:這個檔案是數據字典,記錄每個模型的欄位和它們的資料型別。
  • manifest.json:這是 dbt 執行的詳細計劃,記錄了所有模型、來源、測試以及相關的元數據。
  • index.html:這是一個網頁入口,打開後可以查看生成的文件,包含模型、來源和測試的詳情。

logs/

當 dbt 執行時,會自動生成日誌檔案,記錄整個執行過程。這些日誌不僅包含查詢的執行紀錄,還包括查詢的性能資訊,幫助你診斷問題或進行查詢優化。

其實上面的資料夾結構都是 dbt init 初始化後會看到的,如果要另外命名也都可以,只需要在 dbt_project.yml 設定清楚就好了,也會有其他大家習慣的用法,例如用 data/ 來放測試驗證資料,如果你想用 test-data/ 其實也都可以,會一個個介紹是為了讓新手同學們不要驚慌,先有個大概念,後續就會覺得 dbt 真是簡單好用/images/emoticon/emoticon07.gif

小結

明天會帶大家開始一個 dbt 專案,也會詳細介紹 dbt_project.ymlprofile.yml 的細節,還有環境的架設,接著應該後天就能講經典的 Jaffle Shop 了吧~/images/emoticon/emoticon12.gif


上一篇
【Day 9】數據轉換最悪の世代:DBT 簡介
下一篇
【Day 11】DBT 新手村入門:環境設定介紹
系列文
我獨自升級:從水管工走向 DataOps30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言